package com.adee.java;

import java.util.Arrays;

/**
 * https://blog.csdn.net/londa/article/details/119296502
 *
 * Arrays类的binarySearch()方法，可以使用二分搜索法来搜索指定的数组，以获得指定对象。该方法返回要搜索元素的索引值。务必注意：数组必须经过排序才可以使用此方法，否则返回下标显示不准。binarySearch()方法提供多种重载形式，用于满足各种类型数组的查找需要。下文主要介绍两个比较重要、常用的方法：
 *
 * 1）  binarySearch(Object[] a, Object key)
 * a: 要搜索的数组
 *
 * key：要搜索的值
 *
 * 如果key在数组中，则返回搜索值的索引；否则返回-1或“-”（插入点）。插入点是索引键将要插入数组的那一点，即第一个大于该键的元素的索引。
 *
 * 技巧：
 *
 * [1] 搜索值不是数组元素，且在数组范围内，从1开始计数，得“ - 插入点索引值”；
 *
 * [2] 搜索值是数组元素，从0开始计数，得搜索值的索引值；
 *
 * [3] 搜索值不是数组元素，且小于数组内元素，索引值为 – 1；
 *
 * [4] 搜索值不是数组元素，且大于数组内元素，索引值为 – (length + 1);
 *
 *
 * 2）  binarySearch(Object[] a, int fromIndex, int toIndex, Object key)
 * a：要搜索的数组
 *
 * fromIndex：指定范围的开始处索引（包含）
 *
 * toIndex：指定范围的结束处索引（不包含）
 *
 * key：要搜索的值
 *
 * 如果要搜索的元素key在指定的范围内，则返回搜索值的索引；否则返回-1或“-”（插入点）。
 *
 * 技巧：
 *
 * [1] 该搜索键在范围内，但不是数组元素，由1开始计数，得“ - 插入点索引值”；
 *
 * [2] 该搜索键在范围内，且是数组元素，由0开始计数，得搜索值的索引值；
 *
 * [3] 该搜索键不在范围内，且小于范围（数组）内元素，返回–(fromIndex + 1)；
 *
 * [4] 该搜索键不在范围内，且大于范围（数组）内元素，返回 –(toIndex + 1)。
 *
 */
public class Test055_Arrays_binarySearch {
    public static void main(String[] args) {

    }

    /**
     * 数字【0】：-1
     * 数字【1】：-1
     * 数字【2】：-1
     * 数字【3】：0
     * 数字【4】：-2
     * 数字【5】：1
     * 数字【6】：-3
     * 数字【7】：2
     * 数字【8】：-4
     * 数字【9】：3
     * 数字【10】：-5
     * 数字【11】：4
     * 数字【12】：-6
     * 数字【13】：5
     * 数字【14】：-7
     * 数字【15】：-7
     * 数字【16】：-7
     */
    public static void test1() {
        int arr[] = new int[]{3, 5, 7, 9, 11, 13};

        Arrays.sort(arr);

        for (int i = 0; i < 17; i++) {
            System.out.println("数字【" + i + "】：" + Arrays.binarySearch(arr, i));
        }
    }

    /**
     * 数字【0】：-2
     * 数字【1】：-2
     * 数字【2】：-2
     * 数字【3】：-2
     * 数字【4】：-2
     * 数字【5】：1
     * 数字【6】：-3
     * 数字【7】：2
     * 数字【8】：-4
     * 数字【9】：3
     * 数字【10】：-5
     * 数字【11】：-5
     * 数字【12】：-5
     * 数字【13】：-5
     * 数字【14】：-5
     * 数字【15】：-5
     * 数字【16】：-5
     */
    public static void test2() {
        int arr[] = new int[]{3, 5, 7, 9, 11, 13};

        Arrays.sort(arr);

        for (int i = 0; i < 17; i++) {
            System.out.println("数字【" + i + "】：" + Arrays.binarySearch(arr, 1, 4, i));
        }
    }


}
